import fetch from "dva/fetch";
import moment from "moment";

export let localUrl;
if (window.location.host.indexOf("localhost") > -1) {
  localUrl = "https://nmmwsaas.nmgcyy.com.cn";
  // localUrl ='https://cyyjg.sobeylingyun.com'
} else {
  localUrl = `${document.location.protocol}//${window.location.host}`;
}

export const baiduKey = "4dca4cd973";

/**
 * 封装post和get请求
 * @param {string} url
 * @param {string} method
 * @param {object} data
 */
export const call = function(url, method = "get", data = {}) {
  url = localUrl + url;
  if (method === "get") {
    let urls = "?";
    for (const key in data) {
      if (data.hasOwnProperty(key)) {
        urls = `${urls}${key}=${data[key]}&`;
      }
    }
    url = url + urls;
    return request(url, { headers: { Token: window.localStorage.getItem("token"), System: window.localStorage.getItem("system"), "Access-key": window.localStorage.getItem("access_key") } });
  } else if (method === "post") {
    return request(url, {
      method: "post",
      mode: "cors",
      headers: {
        "Content-Type": "application/json; charset=utf-8",
        Token: window.localStorage.getItem("token") ,
        System: window.localStorage.getItem("system"),
        "Access-key": window.localStorage.getItem("access_key") 
      },
      body: JSON.stringify(data)
    });
  }
};

/**
 * 转换json
 */
function parseJSON(response) {
  return response.json();
}

/**
 * 验证http状态
 * @param {promise} response
 */
function checkStatus(response) {
  if (response.status >= 200 && response.status < 300) {
    return response;
  }

  const error = new Error(response.statusText);
  error.response = response;
  throw error;
}

/**
 * 深拷贝
 * @param {object} obj
 */
// function deepClone(obj) {
//   let _obj = JSON.stringify(obj),
//     objClone = JSON.parse(_obj);
//   return objClone;
// }

/**
 * Requests a URL, returning a promise.
 *
 * @param  {string} url       The URL we want to request
 * @param  {object} [options] The options we want to pass to "fetch"
 * @return {object}           An object containing either "data" or "err"
 */
export default function request(url, options) {
  return fetch(url, options)
    .then(checkStatus)
    .then(parseJSON)
    .then(data => data)
    .catch(err => ({ err }));
}

/**
 * type 转汉字
 * @param {*} str  接收    1,2,3,4
 * @return         返回    文章、图集、banner、视频
 */
export function typeToStr(str) {
  let arr = str.split(",");
  let s = "";
  console.log(arr);
  arr.forEach(item => {
    if (item === 1) {
      s += "文章、";
    } else if (item === 2) {
      s += "图集、";
    } else if (item === 3) {
      s += "Banner、";
    } else if (item === 4) {
      s += "视频、";
    } else if (item === 5) {
      s += "服务、";
    } else if (item === 6) {
      s += "直播、";
    } else if (item === 7) {
      s += "电视、";
    } else if (item === 8) {
      s += "广播、";
    } else if (item === 9) {
      s += "广告、";
    }
  });
  s = s.substr(0, s.length - 1);
  return s;
}

export function typeToTag(item) {
  let s;
  if (item === 1) {
    s = "文章";
  } else if (item === 2) {
    s = "图集";
  } else if (item === 3) {
    s = "Banner";
  } else if (item === 4) {
    s = "视频";
  } else if (item === 5) {
    s = "服务";
  } else if (item === 6) {
    s = "直播";
  } else if (item === 7) {
    s = "电视";
  } else if (item === 8) {
    s = "广播";
  } else if (item === 9) {
    s = "广告";
  }
  return s;
}

/**
 * 时间戳格式化函数
 * @param  {string} format    格式
 * @param  {int}    timestamp 要格式化的时间 默认为当前时间
 * @return {string}           格式化的时间字符串
 */
export function date(format, timestamp) {
  var jsdate = timestamp ? new Date(timestamp * 1000) : new Date();
  var pad = function(n, c) {
    if ((n = n + "").length < c) {
      return new Array(++c - n.length).join("0") + n;
    } else {
      return n;
    }
  };
  var txt_weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
  var txt_ordin = { 1: "st", 2: "nd", 3: "rd", 21: "st", 22: "nd", 23: "rd", 31: "st" };
  var txt_months = ["", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
  var f = {
    // Day
    d: function() {
      return pad(f.j(), 2);
    },
    D: function() {
      return f.l().substr(0, 3);
    },
    j: function() {
      return jsdate.getDate();
    },
    l: function() {
      return txt_weekdays[f.w()];
    },
    N: function() {
      return f.w() + 1;
    },
    S: function() {
      return txt_ordin[f.j()] ? txt_ordin[f.j()] : "th";
    },
    w: function() {
      return jsdate.getDay();
    },
    z: function() {
      return ((jsdate - new Date(jsdate.getFullYear() + "/1/1")) / 864e5) >> 0;
    },

    // Week
    W: function() {
      var a = f.z(),
        b = 364 + f.L() - a;
      var nd2,
        nd = (new Date(jsdate.getFullYear() + "/1/1").getDay() || 7) - 1;
      if (b <= 2 && (jsdate.getDay() || 7) - 1 <= 2 - b) {
        return 1;
      } else {
        if (a <= 2 && nd >= 4 && a >= 6 - nd) {
          nd2 = new Date(jsdate.getFullYear() - 1 + "/12/31");
          return date("W", Math.round(nd2.getTime() / 1000));
        } else {
          return (1 + (nd <= 3 ? (a + nd) / 7 : (a - (7 - nd)) / 7)) >> 0;
        }
      }
    },

    // Month
    F: function() {
      return txt_months[f.n()];
    },
    m: function() {
      return pad(f.n(), 2);
    },
    M: function() {
      return f.F().substr(0, 3);
    },
    n: function() {
      return jsdate.getMonth() + 1;
    },
    t: function() {
      var n;
      if ((n = jsdate.getMonth() + 1) === 2) {
        return 28 + f.L();
      } else {
        if ((n & 1 && n < 8) || (!(n & 1) && n > 7)) {
          return 31;
        } else {
          return 30;
        }
      }
    },

    // Year
    L: function() {
      var y = f.Y();
      return !(y & 3) && (y % 1e2 || !(y % 4e2)) ? 1 : 0;
    },
    //o not supported yet
    Y: function() {
      return jsdate.getFullYear();
    },
    y: function() {
      return (jsdate.getFullYear() + "").slice(2);
    },

    // Time
    a: function() {
      return jsdate.getHours() > 11 ? "pm" : "am";
    },
    A: function() {
      return f.a().toUpperCase();
    },
    B: function() {
      // peter paul koch:
      var off = (jsdate.getTimezoneOffset() + 60) * 60;
      var theSeconds = jsdate.getHours() * 3600 + jsdate.getMinutes() * 60 + jsdate.getSeconds() + off;
      var beat = Math.floor(theSeconds / 86.4);
      if (beat > 1000) beat -= 1000;
      if (beat < 0) beat += 1000;
      if (String(beat).length === 1) beat = "00" + beat;
      if (String(beat).length === 2) beat = "0" + beat;
      return beat;
    },
    g: function() {
      return jsdate.getHours() % 12 || 12;
    },
    G: function() {
      return jsdate.getHours();
    },
    h: function() {
      return pad(f.g(), 2);
    },
    H: function() {
      return pad(jsdate.getHours(), 2);
    },
    i: function() {
      return pad(jsdate.getMinutes(), 2);
    },
    s: function() {
      return pad(jsdate.getSeconds(), 2);
    },
    //u not supported yet

    // Timezone
    //e not supported yet
    //I not supported yet
    O: function() {
      var t = pad(Math.abs((jsdate.getTimezoneOffset() / 60) * 100), 4);
      if (jsdate.getTimezoneOffset() > 0) t = "-" + t;
      else t = "+" + t;
      return t;
    },
    P: function() {
      var O = f.O();
      return O.substr(0, 3) + ":" + O.substr(3, 2);
    },
    //T not supported yet
    //Z not supported yet

    // Full Date/Time
    c: function() {
      return f.Y() + "-" + f.m() + "-" + f.d() + "T" + f.h() + ":" + f.i() + ":" + f.s() + f.P();
    },
    //r not supported yet
    U: function() {
      return Math.round(jsdate.getTime() / 1000);
    }
  };

  return format.replace(/[\\]?([a-zA-Z])/g, function(t, s) {
    let ret = "";
    if (t !== s) {
      // escaped
      ret = s;
    } else if (f[s]) {
      // a date function exists
      ret = f[s]();
    } else {
      // nothing special
      ret = s;
    }
    return ret;
  });
}

export const DateChange = timestamp => {
  let date = null;
  if (timestamp) {
    if (timestamp.toString().length > 10) {
      date = new Date(timestamp); //时间戳为10位需*1000，时间戳为13位的话不需乘1000
    } else {
      date = new Date(timestamp * 1000); //时间戳为10位需*1000，时间戳为13位的话不需乘1000
    }
  } else {
    date = new Date();
  }
  let Y = date.getFullYear() + "-";
  let M = (date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1) + "-";
  let D = date.getDate() + " ";
  let h = date.getHours() + ":";
  let m = date.getMinutes() + ":";
  let s = date.getSeconds();
  return Y + M + D + h + m + s;
};

const getJson = url => {
  let fetchOptions = {
    method: "GET",
    headers: {
      Accept: "application/json",
      "Content-Type": "application/json",
      Authorization: window.localStorage.getItem("token")
      // "token": window.localStorage.getItem('token')
    }
  };
  return new Promise((resolve, reject) => {
    // Progress.show();
    fetch(url, fetchOptions)
      .then(function(response) {
        return response.json();
      })
      .then(function(json) {
        resolve(json);
        // Progress.hide();
      });
  });
};

const postJson = (url, data) => {
  var fetchOptions = {
    method: "POST",
    headers: {
      Accept: "application/json",
      "Content-Type": "application/json",
      Authorization: window.localStorage.getItem("token")
    },
    body: JSON.stringify(data)
  };
  return new Promise((resolve, reject) => {
    // Progress.show();
    fetch(url, fetchOptions)
      .then(response => response.json())
      .then(data => {
        resolve(data);
        // Progress.hide();
      });
  });
};

export const Http = (url, method, data) => {
  let tempUrl = localUrl;
  url = tempUrl + url;
  if (method === "get") {
    let urls = "?";
    for (const key in data) {
      if (data.hasOwnProperty(key)) {
        urls = `${urls}${key}=${data[key]}&`;
      }
    }
    url = url + urls;
    return getJson(url);
  }
  if (method === "post") {
    return postJson(url, data);
  }
};
export function fixedZero(val) {
  return val * 1 < 10 ? `0${val}` : val;
}
export function getTimeDistance(type) {
  const now = new Date();
  const oneDay = 1000 * 60 * 60 * 24;

  if (type === "today") {
    now.setHours(0);
    now.setMinutes(0);
    now.setSeconds(0);
    return [moment(now), moment(now.getTime() + (oneDay - 1000))];
  }

  if (type === "week") {
    let day = now.getDay();
    now.setHours(0);
    now.setMinutes(0);
    now.setSeconds(0);

    if (day === 0) {
      day = 6;
    } else {
      day -= 1;
    }

    const beginTime = now.getTime() - day * oneDay;

    return [moment(beginTime), moment(beginTime + (7 * oneDay - 1000))];
  }

  if (type === "month") {
    const year = now.getFullYear();
    const month = now.getMonth();
    const nextDate = moment(now).add(1, "months");
    const nextYear = nextDate.year();
    const nextMonth = nextDate.month();

    return [moment(`${year}-${fixedZero(month + 1)}-01 00:00:00`), moment(moment(`${nextYear}-${fixedZero(nextMonth + 1)}-01 00:00:00`).valueOf() - 1000)];
  }

  const year = now.getFullYear();
  return [moment(`${year}-01-01 00:00:00`), moment(`${year}-12-31 23:59:59`)];
}
export function getTimeBucket(type) {
  const now = new Date();
  const oneDay = 1000 * 60 * 60 * 24;
  if (type === "halfhour") {
    return moment(now - 1800 * 1000).format("YYYY-MM-DD hh:mm:ss");
  }
  if (type === "oneHour") {
    return moment(now - 3600 * 1000).format("YYYY-MM-DD hh:mm:ss");
  }
  if (type === "threeHours") {
    return moment(now - 10800 * 1000).format("YYYY-MM-DD hh:mm:ss");
  }
  if (type === "twelveHours") {
    return moment(now - 43200 * 1000).format("YYYY-MM-DD hh:mm:ss");
  }
  if (type === "day") {
    return moment(now - oneDay).format("YYYY-MM-DD hh:mm:ss");
  }
  if (type === "Triduum") {
    return moment(now - oneDay * 3).format("YYYY-MM-DD hh:mm:ss");
  }
  if (type === "oneWeek") {
    return moment(now - oneDay * 7).format("YYYY-MM-DD hh:mm:ss");
  }
  if (type === "oneMonth") {
    return moment(now - oneDay * 30).format("YYYY-MM-DD hh:mm:ss");
  }
}
/**
 * 获取get参数
 * @param {*} variable 
 */
export function getQueryVariable(variable) {
  var query = window.location.search.substring(1);
  var vars = query.split("&");
  for (var i = 0; i < vars.length; i++) {
      var pair = vars[i].split("=");
      if (pair[0] == variable) { return pair[1]; }
  }
  return (false);
}
